home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / sndhrdw / 8080bw.c next >
C/C++ Source or Header  |  2000-05-20  |  21KB  |  777 lines

  1. /* 8080bw.c *********************************
  2.  updated: 1997-04-09 08:46 TT
  3.  updated  20-3-1998 LT Added color changes on base explosion
  4.  *
  5.  * Author      : Tormod Tjaberg
  6.  * Created     : 1997-04-09
  7.  * Description : Sound routines for the 'invaders' games
  8.  *
  9.  * Note:
  10.  * The samples were taken from Michael Strutt's (mstrutt@pixie.co.za)
  11.  * excellent space invader emulator and converted to signed samples so
  12.  * they would work under SEAL. The port info was also gleaned from
  13.  * his emulator. These sounds should also work on all the invader games.
  14.  *
  15.  * The sounds are generated using output port 3 and 5
  16.  *
  17.  * Port 3:
  18.  * bit 0=UFO  (repeats)       emulated
  19.  * bit 1=Shot                 1.raw
  20.  * bit 2=Base hit             2.raw
  21.  * bit 3=Invader hit          3.raw
  22.  * bit 4=Bonus base           9.raw
  23.  *
  24.  * Port 5:
  25.  * bit 0=Fleet movement 1     4.raw
  26.  * bit 1=Fleet movement 2     5.raw
  27.  * bit 2=Fleet movement 3     6.raw
  28.  * bit 3=Fleet movement 4     7.raw
  29.  * bit 4=UFO 2                8.raw
  30.  */
  31.  
  32. #include "driver.h"
  33. #include "cpu/i8039/i8039.h"
  34. #include "machine/74123.h"
  35.  
  36. void invaders_flipscreen_w(int data);
  37. void sheriff_flipscreen_w(int data);
  38. void invaders_screen_red_w(int data);
  39.  
  40. static WRITE_HANDLER( invad2ct_sh_port1_w );
  41. static WRITE_HANDLER( invaders_sh_port3_w );
  42. static WRITE_HANDLER( invaders_sh_port5_w );
  43. static WRITE_HANDLER( invad2ct_sh_port7_w );
  44.  
  45. static WRITE_HANDLER( sheriff_sh_port4_w );
  46. static WRITE_HANDLER( sheriff_sh_port5_w );
  47. static WRITE_HANDLER( sheriff_sh_port6_w );
  48.  
  49. static WRITE_HANDLER( helifire_sh_port6_w );
  50.  
  51. static WRITE_HANDLER( ballbomb_sh_port3_w );
  52. static WRITE_HANDLER( ballbomb_sh_port5_w );
  53.  
  54. static WRITE_HANDLER( boothill_sh_port3_w );
  55. static WRITE_HANDLER( boothill_sh_port5_w );
  56. READ_HANDLER( boothill_port_0_r );
  57. READ_HANDLER( boothill_port_1_r );
  58.  
  59. READ_HANDLER( gunfight_port_0_r );
  60. READ_HANDLER( gunfight_port_1_r );
  61.  
  62. READ_HANDLER( seawolf_port_1_r );
  63.  
  64. WRITE_HANDLER( desertgu_controller_select_w );
  65. READ_HANDLER( desertgu_port_1_r );
  66.  
  67. static WRITE_HANDLER( schaser_sh_port3_w );
  68. static WRITE_HANDLER( schaser_sh_port5_w );
  69. static int  schaser_sh_start(const struct MachineSound *msound);
  70. static void schaser_sh_stop(void);
  71. static void schaser_sh_update(void);
  72.  
  73. static WRITE_HANDLER( polaris_sh_port6_w );
  74.  
  75.  
  76. struct SN76477interface invaders_sn76477_interface =
  77. {
  78.     1,    /* 1 chip */
  79.     { 25 },  /* mixing level   pin description         */
  80.     { 0    /* N/C */},        /*    4  noise_res         */
  81.     { 0    /* N/C */},        /*    5  filter_res         */
  82.     { 0    /* N/C */},        /*    6  filter_cap         */
  83.     { 0    /* N/C */},        /*    7  decay_res         */
  84.     { 0    /* N/C */},        /*    8  attack_decay_cap  */
  85.     { RES_K(100) },        /* 10  attack_res         */
  86.     { RES_K(56)  },        /* 11  amplitude_res     */
  87.     { RES_K(10)  },        /* 12  feedback_res      */
  88.     { 0    /* N/C */},        /* 16  vco_voltage         */
  89.     { CAP_U(0.1) },        /* 17  vco_cap             */
  90.     { RES_K(8.2) },        /* 18  vco_res             */
  91.     { 5.0         },        /* 19  pitch_voltage     */
  92.     { RES_K(120) },        /* 20  slf_res             */
  93.     { CAP_U(1.0) },        /* 21  slf_cap             */
  94.     { 0    /* N/C */},        /* 23  oneshot_cap         */
  95.     { 0    /* N/C */}        /* 24  oneshot_res         */
  96. };
  97.  
  98. static const char *invaders_sample_names[] =
  99. {
  100.     "*invaders",
  101.     "1.wav",    /* Shot/Missle */
  102.     "2.wav",    /* Base Hit/Explosion */
  103.     "3.wav",    /* Invader Hit */
  104.     "4.wav",    /* Fleet move 1 */
  105.     "5.wav",    /* Fleet move 2 */
  106.     "6.wav",    /* Fleet move 3 */
  107.     "7.wav",    /* Fleet move 4 */
  108.     "8.wav",    /* UFO/Saucer Hit */
  109.     "9.wav",    /* Bonus Base */
  110.     0       /* end of array */
  111. };
  112.  
  113. struct Samplesinterface invaders_samples_interface =
  114. {
  115.     4,    /* 4 channels */
  116.     25,    /* volume */
  117.     invaders_sample_names
  118. };
  119.  
  120.  
  121. struct SN76477interface invad2ct_sn76477_interface =
  122. {
  123.     2,    /* 2 chips */
  124.     { 25,         25 },  /* mixing level   pin description         */
  125.     { 0,          0    /* N/C */  },    /*    4  noise_res         */
  126.     { 0,          0    /* N/C */  },    /*    5  filter_res         */
  127.     { 0,          0    /* N/C */  },    /*    6  filter_cap         */
  128.     { 0,          0    /* N/C */  },    /*    7  decay_res         */
  129.     { 0,          0    /* N/C */  },    /*    8  attack_decay_cap  */
  130.     { RES_K(100), RES_K(100)   },    /* 10  attack_res         */
  131.     { RES_K(56),  RES_K(56)    },    /* 11  amplitude_res     */
  132.     { RES_K(10),  RES_K(10)    },    /* 12  feedback_res      */
  133.     { 0,          0    /* N/C */  },    /* 16  vco_voltage         */
  134.     { CAP_U(0.1), CAP_U(0.047) },    /* 17  vco_cap             */
  135.     { RES_K(8.2), RES_K(39)    },    /* 18  vco_res             */
  136.     { 5.0,        5.0           },    /* 19  pitch_voltage     */
  137.     { RES_K(120), RES_K(120)   },    /* 20  slf_res             */
  138.     { CAP_U(1.0), CAP_U(1.0)   },    /* 21  slf_cap             */
  139.     { 0,          0    /* N/C */  },    /* 23  oneshot_cap         */
  140.     { 0,          0    /* N/C */  }    /* 24  oneshot_res         */
  141. };
  142.  
  143. static const char *invad2ct_sample_names[] =
  144. {
  145.     "*invaders",
  146.     "1.wav",    /* Shot/Missle - Player 1 */
  147.     "2.wav",    /* Base Hit/Explosion - Player 1 */
  148.     "3.wav",    /* Invader Hit - Player 1 */
  149.     "4.wav",    /* Fleet move 1 - Player 1 */
  150.     "5.wav",    /* Fleet move 2 - Player 1 */
  151.     "6.wav",    /* Fleet move 3 - Player 1 */
  152.     "7.wav",    /* Fleet move 4 - Player 1 */
  153.     "8.wav",    /* UFO/Saucer Hit - Player 1 */
  154.     "9.wav",    /* Bonus Base - Player 1 */
  155.     "11.wav",    /* Shot/Missle - Player 2 */
  156.     "12.wav",    /* Base Hit/Explosion - Player 2 */
  157.     "13.wav",    /* Invader Hit - Player 2 */
  158.     "14.wav",    /* Fleet move 1 - Player 2 */
  159.     "15.wav",    /* Fleet move 2 - Player 2 */
  160.     "16.wav",    /* Fleet move 3 - Player 2 */
  161.     "17.wav",    /* Fleet move 4 - Player 2 */
  162.     "18.wav",    /* UFO/Saucer Hit - Player 2 */
  163.     0       /* end of array */
  164. };
  165.  
  166. struct Samplesinterface invad2ct_samples_interface =
  167. {
  168.     8,    /* 8 channels */
  169.     25,    /* volume */
  170.     invad2ct_sample_names
  171. };
  172.  
  173.  
  174. void init_machine_invaders(void)
  175. {
  176.     install_port_write_handler(0, 0x03, 0x03, invaders_sh_port3_w);
  177.     install_port_write_handler(0, 0x05, 0x05, invaders_sh_port5_w);
  178.  
  179.     SN76477_envelope_1_w(0, 1);
  180.     SN76477_envelope_2_w(0, 0);
  181.     SN76477_mixer_a_w(0, 0);
  182.     SN76477_mixer_b_w(0, 0);
  183.     SN76477_mixer_c_w(0, 0);
  184.     SN76477_vco_w(0, 1);
  185. }
  186.  
  187. void init_machine_invad2ct(void)
  188. {
  189.     init_machine_invaders();
  190.  
  191.     install_port_write_handler(0, 0x01, 0x01, invad2ct_sh_port1_w);
  192.     install_port_write_handler(0, 0x07, 0x07, invad2ct_sh_port7_w);
  193.  
  194.     SN76477_envelope_1_w(1, 1);
  195.     SN76477_envelope_2_w(1, 0);
  196.     SN76477_mixer_a_w(1, 0);
  197.     SN76477_mixer_b_w(1, 0);
  198.     SN76477_mixer_c_w(1, 0);
  199.     SN76477_vco_w(1, 1);
  200. }
  201.  
  202.  
  203. /*
  204.    Note: For invad2ct, the Player 1 sounds are the same as for the
  205.          original and deluxe versions.  Player 2 sounds are all
  206.          different, and are triggered by writes to port 1 and port 7.
  207.  
  208. */
  209.  
  210. static void invaders_sh_1_w(int board, int data, unsigned char *last)
  211. {
  212.     int base_channel, base_sample;
  213.  
  214.     base_channel = 4 * board;
  215.     base_sample  = 9 * board;
  216.  
  217.     SN76477_enable_w(board, !(data & 0x01));                /* Saucer Sound */
  218.  
  219.     if (data & 0x02 && ~*last & 0x02)
  220.         sample_start (base_channel+0, base_sample+0, 0);    /* Shot Sound */
  221.  
  222.     if (data & 0x04 && ~*last & 0x04)
  223.         sample_start (base_channel+1, base_sample+1, 0);    /* Base Hit */
  224.  
  225.     if (~data & 0x04 && *last & 0x04)
  226.         sample_stop (base_channel+1);
  227.  
  228.     if (data & 0x08 && ~*last & 0x08)
  229.         sample_start (base_channel+0, base_sample+2, 0);    /* Invader Hit */
  230.  
  231.     if (data & 0x10 && ~*last & 0x10)
  232.         sample_start (base_channel+2, 8, 0);                /* Bonus Missle Base */
  233.  
  234.     invaders_screen_red_w(data & 0x04);
  235.  
  236.     *last = data;
  237. }
  238.  
  239. static void invaders_sh_2_w(int board, int data, unsigned char *last)
  240. {
  241.     int base_channel, base_sample;
  242.  
  243.     base_channel = 4 * board;
  244.     base_sample  = 9 * board;
  245.  
  246.     if (data & 0x01 && ~*last & 0x01)
  247.         sample_start (base_channel+1, base_sample+3, 0);    /* Fleet 1 */
  248.  
  249.     if (data & 0x02 && ~*last & 0x02)
  250.         sample_start (base_channel+1, base_sample+4, 0);    /* Fleet 2 */
  251.  
  252.     if (data & 0x04 && ~*last & 0x04)
  253.         sample_start (base_channel+1, base_sample+5, 0);    /* Fleet 3 */
  254.  
  255.     if (data & 0x08 && ~*last & 0x08)
  256.         sample_start (base_channel+1, base_sample+6, 0);    /* Fleet 4 */
  257.  
  258.     if (data & 0x10 && ~*last & 0x10)
  259.         sample_start (base_channel+3, base_sample+7, 0);    /* Saucer Hit */
  260.  
  261.     invaders_flipscreen_w(data & 0x20);
  262.  
  263.     *last = data;
  264. }
  265.  
  266.  
  267. static WRITE_HANDLER( invad2ct_sh_port1_w )
  268. {
  269.     static unsigned char last = 0;
  270.  
  271.     invaders_sh_1_w(1, data, &last);
  272. }
  273.  
  274. static WRITE_HANDLER( invaders_sh_port3_w )
  275. {
  276.     static unsigned char last = 0;
  277.  
  278.     invaders_sh_1_w(0, data, &last);
  279. }
  280.  
  281. static WRITE_HANDLER( invaders_sh_port5_w )
  282. {
  283.     static unsigned char last = 0;
  284.  
  285.     invaders_sh_2_w(0, data, &last);
  286. }
  287.  
  288. static WRITE_HANDLER( invad2ct_sh_port7_w )
  289. {
  290.     static unsigned char last = 0;
  291.  
  292.     invaders_sh_2_w(1, data, &last);
  293. }
  294.  
  295.  
  296. /*******************************************************/
  297. /*                                                     */
  298. /* Midway "Gun Fight"                                  */
  299. /*                                                     */
  300. /*******************************************************/
  301.  
  302. void init_machine_gunfight(void)
  303. {
  304.     install_port_read_handler(0, 0x00, 0x00, gunfight_port_0_r);
  305.     install_port_read_handler(0, 0x01, 0x01, gunfight_port_1_r);
  306. }
  307.  
  308.  
  309. /*******************************************************/
  310. /*                                                     */
  311. /* Midway "Boot Hill"                                  */
  312. /*                                                     */
  313. /*******************************************************/
  314.  
  315. static const char *boothill_sample_names[] =
  316. {
  317.     "*boothill", /* in case we ever find any bootlegs hehehe */
  318.     "addcoin.wav",
  319.     "endgame.wav",
  320.     "gunshot.wav",
  321.     "killed.wav",
  322.     0       /* end of array */
  323. };
  324.  
  325. struct Samplesinterface boothill_samples_interface =
  326. {
  327.     9,    /* 9 channels */
  328.     25,    /* volume */
  329.     boothill_sample_names
  330. };
  331.  
  332.  
  333. /* HC 4/14/98 NOTE: *I* THINK there are sounds missing...
  334. i dont know for sure... but that is my guess....... */
  335.  
  336. void init_machine_boothill(void)
  337. {
  338.     install_port_read_handler (0, 0x00, 0x00, boothill_port_0_r);
  339.     install_port_read_handler (0, 0x01, 0x01, boothill_port_1_r);
  340.  
  341.     install_port_write_handler(0, 0x03, 0x03, boothill_sh_port3_w);
  342.     install_port_write_handler(0, 0x05, 0x05, boothill_sh_port5_w);
  343. }
  344.  
  345. static WRITE_HANDLER( boothill_sh_port3_w )
  346. {
  347.     switch (data)
  348.     {
  349.         case 0x0c:
  350.             sample_start (0, 0, 0);
  351.             break;
  352.  
  353.         case 0x18:
  354.         case 0x28:
  355.             sample_start (1, 2, 0);
  356.             break;
  357.  
  358.         case 0x48:
  359.         case 0x88:
  360.             sample_start (2, 3, 0);
  361.             break;
  362.     }
  363. }
  364.  
  365. /* HC 4/14/98 */
  366. static WRITE_HANDLER( boothill_sh_port5_w )
  367. {
  368.     switch (data)
  369.     {
  370.         case 0x3b:
  371.             sample_start (2, 1, 0);
  372.             break;
  373.     }
  374. }
  375.  
  376.  
  377. /*******************************************************/
  378. /*                                                     */
  379. /* Taito "Balloon Bomber"                              */
  380. /*                                                     */
  381. /*******************************************************/
  382.  
  383. /* This only does the color swap for the explosion */
  384. /* We do not have correct samples so sound not done */
  385.  
  386. void init_machine_ballbomb(void)
  387. {
  388.     install_port_write_handler(0, 0x03, 0x03, ballbomb_sh_port3_w);
  389.     install_port_write_handler(0, 0x05, 0x05, ballbomb_sh_port5_w);
  390. }
  391.  
  392. static WRITE_HANDLER( ballbomb_sh_port3_w )
  393. {
  394.     invaders_screen_red_w(data & 0x04);
  395. }
  396.  
  397. static WRITE_HANDLER( ballbomb_sh_port5_w )
  398. {
  399.     invaders_flipscreen_w(data & 0x20);
  400. }
  401.  
  402.  
  403. /*******************************************************/
  404. /*                                                     */
  405. /* Taito "Polaris"                                       */
  406. /*                                                     */
  407. /*******************************************************/
  408.  
  409. void init_machine_polaris(void)
  410. {
  411.     install_port_write_handler(0, 0x06, 0x06, polaris_sh_port6_w);
  412. }
  413.  
  414. static WRITE_HANDLER( polaris_sh_port6_w )
  415. {
  416.     coin_lockout_global_w(0, data & 0x04);
  417.  
  418.     invaders_flipscreen_w(data & 0x20);
  419. }
  420.  
  421.  
  422. /*******************************************************/
  423. /*                                                     */
  424. /* Nintendo "Sheriff"                                     */
  425. /*                                                     */
  426. /*******************************************************/
  427.  
  428. struct DACinterface sheriff_dac_interface =
  429. {
  430.     1,
  431.     { 50 }
  432. };
  433.  
  434. struct SN76477interface sheriff_sn76477_interface =
  435. {
  436.     1,    /* 1 chip */
  437.     { 50 },  /* mixing level   pin description         */
  438.     { RES_K( 36)   },        /*    4  noise_res         */
  439.     { RES_K(100)   },        /*    5  filter_res         */
  440.     { CAP_U(0.001) },        /*    6  filter_cap         */
  441.     { RES_K(620)   },        /*    7  decay_res         */
  442.     { CAP_U(1.0)   },        /*    8  attack_decay_cap  */
  443.     { RES_K(20)    },        /* 10  attack_res         */
  444.     { RES_K(150)   },        /* 11  amplitude_res     */
  445.     { RES_K(47)    },        /* 12  feedback_res      */
  446.     { 0            },        /* 16  vco_voltage         */
  447.     { CAP_U(0.001) },        /* 17  vco_cap             */
  448.     { RES_M(1.5)   },        /* 18  vco_res             */
  449.     { 0.0           },        /* 19  pitch_voltage     */
  450.     { RES_M(1.5)   },        /* 20  slf_res             */
  451.     { CAP_U(0.047) },        /* 21  slf_cap             */
  452.     { CAP_U(0.047) },        /* 23  oneshot_cap         */
  453.     { RES_K(560)   }        /* 24  oneshot_res         */
  454. };
  455.  
  456.  
  457. static void sheriff_74123_0_output_changed_cb(void)
  458. {
  459.     SN76477_vco_w    (0,  TTL74123_output_r(0));
  460.     SN76477_mixer_b_w(0, !TTL74123_output_r(0));
  461.  
  462.     SN76477_enable_w(0, TTL74123_output_comp_r(0) && TTL74123_output_comp_r(1));
  463. }
  464.  
  465. static void sheriff_74123_1_output_changed_cb(void)
  466. {
  467.     SN76477_set_vco_voltage(0, !TTL74123_output_comp_r(1) ? 5.0 : 0.0);
  468.  
  469.     SN76477_enable_w(0, TTL74123_output_comp_r(0) && TTL74123_output_comp_r(1));
  470. }
  471.  
  472. static struct TTL74123_interface sheriff_74123_0_intf =
  473. {
  474.     RES_K(33),
  475.     CAP_U(33),
  476.     sheriff_74123_0_output_changed_cb
  477. };
  478.  
  479. static struct TTL74123_interface sheriff_74123_1_intf =
  480. {
  481.     RES_K(33),
  482.     CAP_U(33),
  483.     sheriff_74123_1_output_changed_cb
  484. };
  485.  
  486.  
  487. void init_machine_sheriff(void)
  488. {
  489.     install_port_write_handler(0, 0x04, 0x04, sheriff_sh_port4_w);
  490.     install_port_write_handler(0, 0x05, 0x05, sheriff_sh_port5_w);
  491.     install_port_write_handler(0, 0x06, 0x06, sheriff_sh_port6_w);
  492.  
  493.     TTL74123_config(0, &sheriff_74123_0_intf);
  494.     TTL74123_config(1, &sheriff_74123_1_intf);
  495.  
  496.     /* set up the fixed connections */
  497.     TTL74123_reset_comp_w  (0, 1);
  498.     TTL74123_trigger_comp_w(0, 0);
  499.  
  500.     TTL74123_trigger_comp_w(1, 0);
  501.  
  502.     SN76477_envelope_1_w(0, 1);
  503.     SN76477_envelope_2_w(0, 0);
  504.     SN76477_noise_clock_w(0, 0);
  505.     SN76477_mixer_a_w(0, 0);
  506.     SN76477_mixer_c_w(0, 0);
  507. }
  508.  
  509.  
  510. static int sheriff_t0,sheriff_t1,sheriff_p1,sheriff_p2;
  511.  
  512.  
  513. static WRITE_HANDLER( sheriff_sh_port4_w )
  514. {
  515.     sheriff_t0 = data & 1;
  516.  
  517.     sheriff_p1 = (sheriff_p1 & 0x4f) |
  518.                  ((data & 0x02) << 3) |        /* P1.4 */
  519.                  ((data & 0x08) << 2) |        /* P1.5 */
  520.                  ((data & 0x20) << 2);        /* P1.7 */
  521.  
  522.     soundlatch_w(0, sheriff_p1);
  523.  
  524.     cpu_set_irq_line(1, I8035_EXT_INT, ((sheriff_p1 & 0x70) == 0x70) ? ASSERT_LINE : CLEAR_LINE);
  525.  
  526.     TTL74123_trigger_w   (0, data & 0x04);
  527.  
  528.     TTL74123_reset_comp_w(1, data & 0x04);
  529.     TTL74123_trigger_w   (1, data & 0x10);
  530. }
  531.  
  532. static WRITE_HANDLER( sheriff_sh_port5_w )
  533. {
  534.     sheriff_t1 = (data >> 5) & 1;
  535.  
  536.     sheriff_p1 = (sheriff_p1 & 0xb0) |
  537.                  ((data & 0x01) << 3) |        /* P1.3 */
  538.                  ((data & 0x02) << 1) |        /* P1.2 */
  539.                  ((data & 0x04) >> 1) |        /* P1.1 */
  540.                  ((data & 0x08) >> 3) |        /* P1.0 */
  541.                  ((data & 0x10) << 2);        /* P1.6 */
  542.  
  543.     soundlatch_w(0, sheriff_p1);
  544.  
  545.     cpu_set_irq_line(1, I8035_EXT_INT, ((sheriff_p1 & 0x70) == 0x70) ? ASSERT_LINE : CLEAR_LINE);
  546. }
  547.  
  548. static WRITE_HANDLER( sheriff_sh_port6_w )
  549. {
  550.     sheriff_flipscreen_w(data & 0x20);
  551. }
  552.  
  553.  
  554. READ_HANDLER( sheriff_sh_t0_r )
  555. {
  556.     return sheriff_t0;
  557. }
  558.  
  559. READ_HANDLER( sheriff_sh_t1_r )
  560. {
  561.     return sheriff_t1;
  562. }
  563.  
  564. READ_HANDLER( sheriff_sh_p1_r )
  565. {
  566.     return soundlatch_r(0);;
  567. }
  568.  
  569. READ_HANDLER( sheriff_sh_p2_r )
  570. {
  571.     return sheriff_p2;
  572. }
  573.  
  574. WRITE_HANDLER( sheriff_sh_p2_w )
  575. {
  576.     sheriff_p2 = data;
  577.  
  578.     DAC_data_w(0, sheriff_p2 & 0x80 ? 0xff : 0x00);
  579. }
  580.  
  581.  
  582. /*******************************************************/
  583. /*                                                     */
  584. /* Nintendo "HeliFire"                                   */
  585. /*                                                     */
  586. /*******************************************************/
  587.  
  588. void init_machine_helifire(void)
  589. {
  590.     install_port_write_handler(0, 0x06, 0x06, helifire_sh_port6_w);
  591. }
  592.  
  593. static WRITE_HANDLER( helifire_sh_port6_w )
  594. {
  595.     sheriff_flipscreen_w(data & 0x20);
  596. }
  597.  
  598.  
  599. /*******************************************************/
  600. /*                                                     */
  601. /* Midway "Sea Wolf"                                   */
  602. /*                                                     */
  603. /*******************************************************/
  604.  
  605. void init_machine_seawolf(void)
  606. {
  607.     install_port_read_handler (0, 0x01, 0x01, seawolf_port_1_r);
  608. }
  609.  
  610.  
  611. /*******************************************************/
  612. /*                                                     */
  613. /* Midway "Desert Gun"                                 */
  614. /*                                                     */
  615. /*******************************************************/
  616.  
  617. void init_machine_desertgu(void)
  618. {
  619.     install_port_read_handler (0, 0x01, 0x01, desertgu_port_1_r);
  620.  
  621.     install_port_write_handler(0, 0x07, 0x07, desertgu_controller_select_w);
  622. }
  623.  
  624.  
  625. /*******************************************************/
  626. /*                                                     */
  627. /* Taito "Space Chaser"                                */
  628. /*                                                     */
  629. /*******************************************************/
  630.  
  631. /*
  632.  *  The dot sound is a square wave clocked by either the
  633.  *  the 8V or 4V signals
  634.  *
  635.  *  The frequencies are (for the 8V signal):
  636.  *
  637.  *  19.968 MHz crystal / 2 (Qa of 74160 #10) -> 9.984MHz
  638.  *                       / 2 (7474 #14) -> 4.992MHz
  639.  *                       / 256+16 (74161 #5 and #8) -> 18352.94Hz
  640.  *                       / 8 (8V) -> 2294.12 Hz
  641.  *                        / 2 the final freq. is 2 toggles -> 1147.06Hz
  642.  *
  643.  *  for 4V, it's double at 2294.12Hz
  644.  */
  645.  
  646. static int channel_dot;
  647.  
  648. struct SN76477interface schaser_sn76477_interface =
  649. {
  650.     1,    /* 1 chip */
  651.     { 50 },  /* mixing level   pin description         */
  652.     { RES_K( 47)   },        /*    4  noise_res         */
  653.     { RES_K(330)   },        /*    5  filter_res         */
  654.     { CAP_P(470)   },        /*    6  filter_cap         */
  655.     { RES_M(2.2)   },        /*    7  decay_res         */
  656.     { CAP_U(1.0)   },        /*    8  attack_decay_cap  */
  657.     { RES_K(4.7)   },        /* 10  attack_res         */
  658.     { 0               },        /* 11  amplitude_res (variable)     */
  659.     { RES_K(33)    },        /* 12  feedback_res      */
  660.     { 0            },        /* 16  vco_voltage         */
  661.     { CAP_U(0.1)   },        /* 17  vco_cap             */
  662.     { RES_K(39)    },        /* 18  vco_res             */
  663.     { 5.0           },        /* 19  pitch_voltage     */
  664.     { RES_K(120)   },        /* 20  slf_res             */
  665.     { CAP_U(1.0)   },        /* 21  slf_cap             */
  666.     { 0            },        /* 23  oneshot_cap (variable) */
  667.     { RES_K(220)   }        /* 24  oneshot_res         */
  668. };
  669.  
  670. struct DACinterface schaser_dac_interface =
  671. {
  672.     1,
  673.     { 50 }
  674. };
  675.  
  676. struct CustomSound_interface schaser_custom_interface =
  677. {
  678.     schaser_sh_start,
  679.     schaser_sh_stop,
  680.     schaser_sh_update
  681. };
  682.  
  683. static INT16 backgroundwave[32] =
  684. {
  685.     0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff,
  686.     0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff,
  687.    -0x8000,-0x8000,-0x8000,-0x8000,-0x8000,-0x8000,-0x8000,-0x8000,
  688.    -0x8000,-0x8000,-0x8000,-0x8000,-0x8000,-0x8000,-0x8000,-0x8000,
  689. };
  690.  
  691. void init_machine_schaser(void)
  692. {
  693.     install_port_write_handler(0, 0x03, 0x03, schaser_sh_port3_w);
  694.     install_port_write_handler(0, 0x05, 0x05, schaser_sh_port5_w);
  695.  
  696.     SN76477_mixer_a_w(0, 0);
  697.     SN76477_mixer_c_w(0, 0);
  698.  
  699.     SN76477_envelope_1_w(0, 1);
  700.     SN76477_envelope_2_w(0, 0);
  701. }
  702.  
  703. static WRITE_HANDLER( schaser_sh_port3_w )
  704. {
  705.     int explosion;
  706.  
  707.     /* bit 0 - Dot Sound Enable (SX0)
  708.        bit 1 - Dot Sound Pitch (SX1)
  709.        bit 2 - Effect Sound A (SX2)
  710.        bit 3 - Effect Sound B (SX3)
  711.        bit 4 - Effect Sound C (SX4)
  712.        bit 5 - Explosion (SX5) */
  713.  
  714.     if (channel_dot)
  715.     {
  716.         int freq;
  717.  
  718.         mixer_set_volume(channel_dot, (data & 0x01) ? 100 : 0);
  719.  
  720.         freq = 19968000 / 2 / 2 / (256+16) / ((data & 0x02) ? 8 : 4) / 2;
  721.         mixer_set_sample_frequency(channel_dot, freq);
  722.     }
  723.  
  724.     explosion = (data >> 5) & 0x01;
  725.     if (explosion)
  726.     {
  727.         SN76477_set_amplitude_res(0, RES_K(200));
  728.         SN76477_set_oneshot_cap(0, CAP_U(0.1));        /* ???? */
  729.     }
  730.     else
  731.     {
  732.         /* 68k and 200k resistors in parallel */
  733.         SN76477_set_amplitude_res(0, RES_K(1.0/((1.0/200.0)+(1.0/68.0))));
  734.         SN76477_set_oneshot_cap(0, CAP_U(0.1));        /* ???? */
  735.     }
  736.     SN76477_enable_w(0, !explosion);
  737.     SN76477_mixer_b_w(0, explosion);
  738. }
  739.  
  740. static WRITE_HANDLER( schaser_sh_port5_w )
  741. {
  742.     /* bit 0 - Music (DAC) (SX6)
  743.        bit 1 - Sound Enable (SX7)
  744.        bit 2 - Coin Lockout (SX8)
  745.        bit 3 - Field Control A (SX9)
  746.        bit 4 - Field Control B (SX10)
  747.        bit 5 - Flip Screen */
  748.  
  749.     DAC_data_w(0, data & 0x01 ? 0xff : 0x00);
  750.  
  751.     mixer_sound_enable_global_w(data & 0x02);
  752.  
  753.     coin_lockout_global_w(0, data & 0x04);
  754.  
  755.     invaders_flipscreen_w(data & 0x20);
  756. }
  757.  
  758. static int schaser_sh_start(const struct MachineSound *msound)
  759. {
  760.     channel_dot = mixer_allocate_channel(50);
  761.     mixer_set_name(channel_dot,"Dot Sound");
  762.  
  763.     mixer_set_volume(channel_dot,0);
  764.     mixer_play_sample_16(channel_dot,backgroundwave,sizeof(backgroundwave),1000,1);
  765.  
  766.     return 0;
  767. }
  768.  
  769. static void schaser_sh_stop(void)
  770. {
  771.     mixer_stop_sample(channel_dot);
  772. }
  773.  
  774. static void schaser_sh_update(void)
  775. {
  776. }
  777.